package com.jsbs.iam.user.mapper;

import com.jsbs.iam.user.dto.ApplyTypeAddDto;
import com.jsbs.iam.user.dto.ApplyTypeDeleteDto;
import com.jsbs.iam.user.dto.ApplyTypeSelectDto;
import com.jsbs.iam.user.entity.IamApplyTypeBase;
import com.jsbs.iam.user.vo.ApplyTypeInfoVo;
import com.jsbs.iam.user.vo.RelevancyApplyVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @BelongsProject: iam
 * @BelongsPackage: com.jsbs.iam.user.mapper
 * @Author: WangJiYuan
 * @Description:
 * @Version: 2023-01-03  14:03
 */
@Mapper
@Repository
public interface ApplyTypeMapper {
    /**
     * 获取关联应用
     * @param companyCode
     * @return
     */
    List<RelevancyApplyVo> getRelevancyApply(@Param("companyCode") String companyCode);

    /**
     * 查询应用类型编码
     * @return
     */
    String selectApplyTypeId(@Param("companyCode")String companyCode);

    /**
     * 新增应用类型基础数据
     * @param applyTypeAddDto
     */
    void insetApplyTypeMainData(@Param("applyTypeAddDto") ApplyTypeAddDto applyTypeAddDto);

    /**
     * 新增应用类型与组织数据
     * @param applyTypeAddDto
     */
    void insetApplyTypeOrgInfo(@Param("applyTypeAddDto")ApplyTypeAddDto applyTypeAddDto);

    /**
     * 新增关联应用数据
     * @param applyTypeAddDto
     */
    void updateRelevancyApplyData(@Param("applyTypeAddDto")ApplyTypeAddDto applyTypeAddDto);

    /**
     * 查询应用类型数据
     * @param applyTypeSelectDto
     * @return
     */
    List<ApplyTypeInfoVo> getApplyTypeInfo(@Param("applyTypeSelectDto")ApplyTypeSelectDto applyTypeSelectDto);

    /**
     * 校验应用类型名称唯一
     *
     * @param applyTypeName
     * @param companyCode
     * @return
     */
    int verifyApplyTypeName(@Param("applyTypeName")String applyTypeName, @Param("companyCode") String companyCode);

    /**
     * 查询应用类型主数据
     *
     * @param applyTypeCode
     * @param companyCode
     * @return
     */
    IamApplyTypeBase getApplyTypeBase(@Param("applyTypeCode")String applyTypeCode, @Param("companyCode")String companyCode);

    /**
     * 查询应用类型对应的组织数据
     *
     * @param applyTypeCode
     * @param companyCode
     * @return
     */
    List<String> selectApplyTypeOrg(@Param("applyTypeCode")String applyTypeCode, @Param("companyCode")String companyCode);

    /**
     * 查询应用类型关联应用数据
     *
     * @param applyTypeCode
     * @param companyCode
     * @return
     */
    List<String> selectRelevancyApply(@Param("applyTypeCode")String applyTypeCode, @Param("companyCode")String companyCode);

    /**
     * 获取应用类型名称
     *
     * @param applyTypeCode
     * @param companyCode
     * @return
     */
    String getApplyTypeName(@Param("applyTypeCode")String applyTypeCode, @Param("companyCode")String companyCode);

    /**
     * 修改应用类型基础数据
     * @param applyTypeAddDto
     */
    void updateApplyTypeMainData(@Param("applyTypeAddDto")ApplyTypeAddDto applyTypeAddDto);

    /**
     * 清除原有应用类型和组织的关系
     * @param applyTypeAddDto
     */
    void clearApplyTypeOrgInfo(@Param("applyTypeAddDto")ApplyTypeAddDto applyTypeAddDto);

    /**
     * 清除原有关联应用数据
     * @param applyTypeAddDto
     */
    void clearRelevancyApplyData(@Param("applyTypeAddDto")ApplyTypeAddDto applyTypeAddDto);

    /**
     * 逻辑删除应用类型主数据
     * @param applyTypeDeleteDto
     */
    void deleteApplyTypeMain(@Param("applyTypeDeleteDto")ApplyTypeDeleteDto applyTypeDeleteDto);

    /**
     * 校验所关联的应用是否关联其他应用类型
     *
     * @param applyCodes
     * @param applyTypeCode
     * @param companyCode
     * @return
     */
    int verifyRelevancyApply(@Param("applyCodes") List<String> applyCodes, @Param("applyTypeCode") String applyTypeCode, @Param("companyCode") String companyCode);

    /**
     * 功能描述：根据组织范围获取应用类型编码
     * @param orgCodeList
     * @return
     */
    List<String> queryByOrgCode(@Param("orgCodeList") List<String> orgCodeList);

    /**
     * 功能描述：获取应用类型下拉列表
     * @param companyCode
     * @return
     */
    List<IamApplyTypeBase> queryApplyTypeList(@Param("companyCode") String companyCode);

    /**
     * 获取普通管理员的应用类型数据
     * @param applyTypeSelectDto
     * @return
     */
    List<ApplyTypeInfoVo> getAdminRoleApplyTypeData(@Param("applyTypeSelectDto")ApplyTypeSelectDto applyTypeSelectDto);

    /**
     * 通过角色编码查询应用类型编码
     * @param applyTypeSelectDto
     * @return
     */
    List<String> getAdminRoleApplyTypeCodes(@Param("applyTypeSelectDto")ApplyTypeSelectDto applyTypeSelectDto);
}
